package com.sinosoft.vaccinetoai.dao.redis.mapper;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IRedisBaseDao {

    /**
     * @Title: existsKey
     * @TitleExplain:
     * @Description: 判断某个key 是否存在
     * @param key
     * @return boolean
     * @author xzh
     */
    boolean existsKey(String key) throws Exception;

    /**
     * @Title: delete
     * @TitleExplain:
     * @Description: 删除key下的元素
     * @param key
     * @author xzh
     */
    Boolean delete(String key) throws Exception;

    /**
     * @Title: delete
     * @TitleExplain:
     * @Description: 删除keys下的元素
     * @param keys
     * @return Long 条数
     * @author xzh
     */
    Long delete(Collection<String> keys) throws Exception;

    /**
     * @Title: keys
     * @TitleExplain:
     * @Description: 获取当前匹配key
     * @param keyPattern
     * @return Set<String> keys
     * @throws Exception
     * @author xzh
     */
    Set<String> keys(String keyPattern) throws Exception;

    /**
     * @Title: expire
     * @TitleExplain:
     * @Description: 过期
     * @param key
     * @param expire 过期时间（毫秒）
     * @author xzh
     */
    Boolean expire(String key, Long expire) throws Exception;

    /**
     * @Title: incrby
     * @TitleExplain:
     * @Description: 自增某个key下的值
     * @param key
     * @param step 递增数
     * @return long 结果
     * @author xzh
     */
    long incrby(String key, long step) throws Exception;

    /**
     * @Title: incrby
     * @TitleExplain:
     * @Description: 自增某个key下的值
     * @param key
     * @param step 递增数
     * @return double 结果
     * @author xzh
     */
    double incrby(String key, double step) throws Exception;

    /**
     * @Title: hIncrby
     * @TitleExplain:
     * @Description: 自增hash某个key下的值
     * @param key
     * @param subKey
     * @param step 递增数
     * @return long 结果
     * @author xzh
     */
    long hIncrby(String key, String subKey, long step) throws Exception;

    /**
     * @Title: hIncrby
     * @TitleExplain:
     * @Description: 自增hash某个key下的值
     * @param key
     * @param subKey
     * @param step 递增数
     * @return double 结果
     * @author xzh
     */
    double hIncrby(String key, String subKey, double step) throws Exception;

    /**
     * @Title: setString
     * @TitleExplain:
     * @Description: 写入一个字符串
     * @param key
     * @param value  值
     * @author xzh
     */
    <V> void setString(String key, V value) throws Exception;

    /**
     * @Title: setString
     * @TitleExplain:
     * @Description: 写入一个字符串 过期
     * @param key
     * @param value 值
     * @param expire 过期时间（毫秒）
     * @author xzh
     */
    <V> void setString(String key, V value, Long expire) throws Exception;

    /**
     * @Title: setStringIfAbsent
     * @TitleExplain:
     * @Description: 如果不存在则写入一个字符串
     * @param key
     * @param value  值
     * @author xzh
     */
    <V> Boolean setStringIfAbsent(String key, V value) throws Exception;

    /**
     * @Title: setStringIfAbsent
     * @TitleExplain:
     * @Description: 如果不存在则写入一个字符串 过期
     * @param key
     * @param value 值
     * @param expire 过期时间（毫秒）
     * @author xzh
     */
    <V> Boolean setStringIfAbsent(String key, V value, Long expire) throws Exception;

    /**
     * @Title: getString
     * @TitleExplain:
     * @Description: 获得一个字符串
     * @param key
     * @return String
     * @author xzh
     */
    String getString(String key) throws Exception;

    /**
     * @Title: setHash
     * @TitleExplain:
     * @Description: 写入一个map
     * @param key
     * @param map  要写入的map
     * @author xzh
     */
    <HK, HV> void setHash(String key, Map<HK, HV> map) throws Exception;

    /**
     * @Title: getHash
     * @TitleExplain:
     * @Description: 取得一个map
     * @param key
     * @return Map<String,String>
     * @author xzh
     */
    <HK, HV> Map<HK, HV> getHash(String key) throws Exception;

    /**
     * @Title: pushToList
     * @TitleExplain:
     * @Description: 向List写入值
     * @param key
     * @param pushType true 在list头部写入  false 在list尾部写入
     * @param values 要写入的值 可以是单个字符串  或者  字符串数组
     * @return Long
     * @author xzh
     */
    <V> Long pushToList(String key, boolean pushType, V... values) throws Exception;

    /**
     * @Title: popFormList
     * @TitleExplain:
     * @Description: 从list 获取值
     * @param key
     * @param pushType true 在list头部取出  false 在list尾部取出
     * @return V
     * @author xzh
     */
    <V> V popFormList(String key, boolean pushType) throws Exception;

    /**
     * @Title: setZSet
     * @TitleExplain:
     * @Description:  zset结构中插入数据
     * @param key
     * @param valMap set值map key:值  值:score
     * @author xzh
     */
    <V> void setZSet(String key, Map<V, Double> valMap) throws Exception;

    /**
     * @Title: removeZSet
     * @TitleExplain:
     * @Description:  zset结构中删除数据
     * @param key
     * @param list 需要移除的值
     * @return Long 数量
     * @author xzh
     */
    <V> Long removeZSet(String key, List<V> list) throws Exception;

    /**
     * @Title: removeList
     * @TitleExplain:
     * @Description: 从list中移除数据
     * @param key
     * @param list 需要移除的值
     * @return Long 数量
     * @author xzh
     */
    <V> Long removeList(String key, List<V> list) throws Exception;

    /**
     * @Title: getValueFromHash
     * @TitleExplain:
     * @Description: 从hash里面获得subkey的值
     * @param key
     * @param subKey 二级key
     * @return String  subkey对应的value
     * @author xzh
     */
    String getValueFromHash(String key, String subKey) throws Exception;

    /**
     * @Title: setValueToHash
     * @TitleExplain:
     * @Description:
     * @param key map key
     * @param subKey 二级key
     * @param value 值
     * @return Boolean 是否成功
     * @throws Exception
     * @author xzh
     */
    Boolean setValueToHash(String key, String subKey, String value) throws Exception;

    /**
     * @Title: delHashField
     * @TitleExplain:
     * @Description: 删除hash结构中的二级key
     * @param key map key
     * @param subKey 二级key
     * @return Long 删除个数
     * @throws Exception
     * @author xzh
     */
    Long delHashField(String key, String subKey) throws Exception;

    /**
     * @Title: getAllFromList
     * @TitleExplain:
     * @Description: 获得list中的值
     * @param key
     * @return List<V>  list
     * @author xzh
     */
    <V> List<V> getAllFromList(String key) throws Exception;

    /**
     * @Title: getAllFromZSet
     * @TitleExplain:
     * @Description: 获得zset中的值
     * @param key
     * @return Set<V> list
     * @author xzh
     */
    <V> Set<V> getAllFromZSet(String key) throws Exception;

    /**
     * @Title: rangeFromList
     * @TitleExplain:
     * @Description: 获取list中一部分值
     * @param key
     * @param start 开始index
     * @param end 结束index
     * @return Set<V>
     * @author xzh
     */
    <V> Set<V> rangeFromList(String key, int start, int end) throws Exception;

    /**
     * @Title: llen
     * @TitleExplain:
     * @Description: 获取当前list的大小
     * @param key
     * @return Long
     * @author xzh
     */
    Long llen(String key) throws Exception;

    /**
     * 执行 Lua 脚本
     * @param script Lua 脚本内容
     * @param keys Redis 键的集合
     * @param args Lua 脚本的参数
     * @param <T> 返回值类型
     * @return 执行结果
     * @throws Exception 执行中可能发生的异常
     */
    <T> T executeLuaScript(String script, List<String> keys, List<String> args, Class<T> resultType) throws Exception;


}
